package com.wf.callback;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @Author mpk
 * @Description TODO
 *
 * 消息生产者的回调接口 - MyCallBack
 */
@Component
@Slf4j
public class GlobalCallBack implements RabbitTemplate.ConfirmCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //初始化时依赖注入 ，在rabbitTemplate之后，再设置它的回调对象
    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
    }

    /**
     * 交换机确认回调方法
     * @param correlationData
     * @param ack
     * @param cause
     *
     * 第一种情况：交换机接收到了   回调
     *      1. correlationData参数：保存回调消息的ID及相关信息
     *      2. ack参数：交换机收到消息  ack = true
     *      3. cause参数：null
     *
     * 第二种情况：交换机接收失败了 回调
     *      1. correlationData参数：保存回调消息的ID及相关信息
     *      2. ack参数：交换机收到消息  ack = false
     *      3. cause参数：失败的原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        //获取消息的ID
        String id = correlationData!=null ? correlationData.getId(): "";
        if(ack){
            log.info("交换机已经收到ID为：{}的消息",id);
        }else{
            log.info("交换机还未收到ID为：{}的消息，原因为：{}", id , cause);
        }
    }
}